package com.ittao.taoaicodeapp.service;

import com.ittao.taoaicodemodel.model.dto.chathistory.ChatHistoryQueryRequest;
import com.ittao.taoaicodemodel.model.entity.ChatHistory;
import com.ittao.taoaicodemodel.model.entity.User;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

import java.time.LocalDateTime;

/**
 * 对话历史 服务层。
 *
 * @author <a href="https://gitee.com/it-heima-ht">程序员 Tao</a>
 */
public interface ChatHistoryService extends IService<ChatHistory> {

    /**
     * 添加对话历史
     * @param appId 应用 id
     * @param message 消息
     * @param messageType 消息类型
     * @param userId 用户 id
     * @return 是否添加成功
     */
    boolean addChatMessage(Long appId, String message, String messageType, Long userId);

    /**
     * 根据应用 ID 删除对应的对话历史
     * @param appId 应用 ID
     * @return 是否删除成功
     */
    boolean deleteByAppId(Long appId);

    /**
     * 分页获取某应用的对话历史
     *
     * @param appId          应用 id
     * @param pageSize       每页大小
     * @param lastCreateTime 上次最后一条数据的创建时间，第一页传 null
     * @param loginUser     登录用户
     * @return 应用的对话历史分页
     */
    Page<ChatHistory> listAppChatHistoryByPage(Long appId, int pageSize,
                                               LocalDateTime lastCreateTime,
                                               User loginUser);

    /**
     * 加载对话历史到内存
     * @param appId 应用 id
     * @param chatMemory 对话记忆对象
     * @param maxCount 最大加载数量
     * @return 实际加载数量
     */
    int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory, int maxCount);

    /**
     * 获取查询包装类
     *
     * @param chatHistoryQueryRequest 历史对话查询请求
     * @return 查询包装类
     */
    QueryWrapper getQueryWrapper(ChatHistoryQueryRequest chatHistoryQueryRequest);

    /**
     * 导出应用的对话历史为Markdown格式
     *
     * @param appId 应用ID
     * @param loginUser 登录用户
     * @return Markdown格式的对话历史内容
     */
    String exportChatHistoryToMarkdown(Long appId, User loginUser);
}
